Python爬虫-百度模拟登录(二)
作者:星星在线 Python爱好者社区专栏作者
简书地址:https://www.jianshu.com/u/680e0e38ddc9
前文传送门:
接上一篇的继续
参数 codestring
套路我相信很多人已经掌握了,先在Charles中搜索值
参数值都看到了,token、tt、dv、callback这些变化的参数我们都知道了吧,其他的参数固定,别问我为什么。这个logincheck注意到了吗?是不是有人能想起前面的?不能放在字典里赋空值,要直接写在url后面,好了轻松搞定codestring。
参数 verifycode
验证码就不用全量搜索了,图片嘛,浏览一下图片请求就知道了
参数是codestring不用我提醒了吧,请求一下手动输入哦,有的人问为什么不搞自动识别的,其实没有必要,现在打码平台很便宜,而且大部分验证码都可以搞定,如果自己去搞得话,太费时间识别率还低,所以我这里就不说验证码这个了,如果有时间以后单独写一篇吧。
参数 traceid
老套路先搜索值,没搜到!!!,换name试试
搜了很多发现都是这个createTraceID函数创建的
都找到了,自己翻译一下吧
参数 ppui_logintime
又是个时间,直接搜name吧
只搜到这一个,然后搜一下timespan
当前时间减去一个初始时间,这是一个时间段,应该是从某次请求开始到某次请求结束,对于这种我们捏造一个吧,没必要那么精确,看一下大概的时间,取15000~30000吧
参数 rsakey
搜一下值
需要的参数不说了哦,这回看看返回值,pubkey、key,这个key的值就是我们的rsakey,pubkey我们后面会用到,先记下
fp_info&fp_uid
这两个参数放在一起说,注意fp_uid和fp_info前面的是一样的,从002~~开始不一样了
先搜了fp_uid,发现是获取cookie的,又没有搜到set cookie的地方,那么有可能是通过本地生成的,对于本地生成的,其实最简单就是固定值,我也是使用固定值试了试,没有问题,当然是调试了一番以后才这么做的,因为调试太麻烦了。再搜一下fp_info看看吧
这个就可能性比较大了,开始调试了,打开chrome->隐身模式->清理缓存->打开百度首页->点击一下登录按钮,找到刚才的js文件,搜~~~
然后再清理缓存,重新刷新百度首页,点击登录按钮
打印一下n和t的值
开始调试,进入到这个函数以后,我们看到这里有几个函数d.genGUID,打印一下看看
是不是有点fp_uid的样子了,那就它了,这是哪个函数呢,很简单,打印一下
翻译成python或者用python执行js脚本的方式都行,fp_uid干掉了吧,fp_info后半部分太麻烦了,有谁搞定了麻烦告诉我一声。我这里就用固定值了。
参数password
搜一下password=
断点打好了就开始调试吧,完犊子了今天死活调试不到断点处了,其实这个比较明显的,当然如果你对rsa加密不了解或者了解的不多那就不容易了,首先想想我们前面获取的pubkey的值,-----BEGIN PUBLIC KEY-----......-----END PUBLIC KEY-----\n,我先贴一下代码吧
def encript_password(self, password, pubkey):
pub = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode('utf-8'))
encript_passwd = rsa.encrypt(password.encode('utf-8'), pub)
return base64.b64encode(encript_passwd).decode('utf-8')
看一下这个load_pkcs1_openssl_pem函数
def load_pkcs1_openssl_pem(cls, keyfile):
"""Loads a PKCS#1.5 PEM-encoded public key file from OpenSSL.
These files can be recognised in that they start with BEGIN PUBLIC KEY rather than BEGIN RSA PUBLIC KEY.
The contents of the file before the "-----BEGIN PUBLIC KEY-----" and after the "-----END PUBLIC KEY-----" lines is ignored.
:param keyfile: contents of a PEM-encoded file that contains the public key, from OpenSSL.
:return: a PublicKey object
"""
der = rsa.pem.load_pem(keyfile, 'PUBLIC KEY')
return cls.load_pkcs1_openssl_der(der)
如果js可以调试进去_SBCtoDBC,你就会发现它对BEGIN和END的处理,那实际上它就是在做rsa加密,所以说如果你了解rsa的这种加密方式,看到BEGIN PUBLIC KEY和END PUBLIC KEY的时候就马上能猜出来了,所以加密函数已经给你了,pubkey获取了,password你自己知道,那这个也搞定了。
至此,登录参数都搞定了,我们可以向下进行了
请求的url和参数都在登录的返回值里,解析一下https://www.baidu.com/cache/user/html/v3Jump.html?err_no=0&callback=parent.bd__pcbs__psvho&codeString=&userName=wuqing198985&phoneNumber=&mail=&hao123Param=RmxaRU5VTVcxTVNWcDFiMDlEU3psMWFVeGtaa2c0TldOSk0yVk1WVFV0WWxCcmVuUmxWSEl0VWpsaVl6bGhRVUZCUVVGQkpDUUFBQUFBQUFBQUFBRUFBQUNzdWQwS2QzVnhhVzVuTVRrNE9UZzFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIM2dwMXA5NEtkYVJG&u=https://www.baidu.com/&tpl=mn&secstate=&gotourl=&authtoken=&loginproxy=&resetpwd=&vcodetype=&lstr=<oken=&bckv=1&bcsync=KnqkeCS8J7B9vuKnaRltPTrp9Kl0hPsH6votXG00OmsypOV8lYboSn7pxuyb%2F1l8XUlp9M0v0gIKoL9og3nXmZYFaGCcMO%2Fx4roGpF7SFA0cqXGlnhwGeBmIY5cVxgeM6aJ2RjPXp3fb6q41WjTiipEvOXCvcfuW7XLemxoEv%2F2ribszd6n7ql7aO7l850fOFqzBiZGeBNu3D0OZFnJeSsOHMEquD6Ahw9dbRl9ahaaRSEMDxQtrn36Bj2jayIY88OTyu7CWjtApT2eZ2SfAjBhr3IzHbnbSPhtoL82nsH7WwqHGeqq3uxYDdqH7ZkgjE3JlQV9SDQCPTnfpPxIrYg%3D%3D&bcchecksum=2590966377&code=&bdToken=&realnameswitch=&setpwdswitch=&bctime=1520951421&bdstoken=&authsid=&jumpset=&appealurl=&realnameverifyemail=0&traceid=&realnameauthsid=&accounts=
请求完以后,返回值里没有什么明显的有用值,那我就直接访问了一下首页
我们怎么判定登录成功呢,一般就是获取有用户名的页面,然后获取一下用户名,看是否存在,如果有那么就登录成功了。很幸运访问首页后登录成功了。百度模拟登录到这里就结束了。之前微博模拟登录的时候,访问一个页面,返回值里是下一个页面链接,再访问再返回下一个。我们在处理这种的时候呢,我们要怎么处理呢?
逆向推理:首先找我们需要的目标点,比如一开始我就找登录请求,然后看登录请求里面需要哪些参数,然后再一步步分析这些参数的来源,其实就是逆向推,另外登录请求完成后,再找一个目标点,就是已登录的页面,如果没有成功,就从登录往下看。基本就是这么一个思路。
最后要再说一下,写这个的目的并不是为了什么项目之类的,就是学习,练习一下,所以大家就不要吹毛求疵了,而且我也不接受吐槽。其他文章可以查看我的简书呦。https://www.jianshu.com/u/680e0e38ddc9
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。